<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>10.8 Retrieval Augmented Generation (RAG)（检索增强生成） - Langchain框架教程</title>
    <link rel="stylesheet" href="../shared_styles.css">
</head>
<body>
    <div class="container">
        <h1> 第十章：AI系统提示词设计进阶</h1>
        <section id="s10-8">
            <h2>10.8 Retrieval Augmented Generation (RAG)（检索增强生成）</h2>
            <p>Retrieval Augmented Generation (RAG)（检索增强生成）是一种结合了信息检索和文本生成的技术，旨在提高大型语言模型（LLM）生成文本的准确性、相关性和事实性，尤其是在处理特定领域知识或需要最新信息时。RAG通过在生成答案之前从外部知识库中检索相关信息，并将这些信息作为上下文提供给LLM，从而克服了LLM在训练数据上的局限性。</p>

            <h3>RAG 的原理</h3>
            <p>传统的LLM在生成文本时仅依赖于其训练数据中包含的知识。这可能导致以下问题：</p>
            <ul>
                <li><strong>知识过时：</strong> 训练数据是静态的，LLM无法获取训练后发生的最新信息。</li>
                <li><strong>事实错误：</strong> LLM可能“幻觉”出不存在的事实或生成不准确的信息。</li>
                <li><strong>领域知识不足：</strong> LLM可能对特定领域（如医学、法律、某个公司的内部文档）的知识了解有限。</li>
            </ul>
            <p>RAG通过引入一个检索步骤来解决这些问题。其基本流程如下：</p>
            <ol>
                <li><strong>用户查询：</strong> 用户提出一个问题或提供一个需要生成文本的提示。</li>
                <li><strong>信息检索：</strong> 系统使用用户查询作为检索条件，从一个外部知识库（如文档数据库、向量数据库、网页等）中检索相关的文档片段或信息。</li>
                <li><strong>上下文构建：</strong> 将检索到的相关信息与原始用户查询结合，构建一个新的、更丰富的提示词。</li>
                <li><strong>文本生成：</strong> 将构建好的提示词输入到LLM中，LLM利用这些额外的上下文信息来生成最终的响应。</li>
            </ol>
            <p>通过这种方式，RAG使得LLM能够访问和利用外部的、最新的或特定领域的知识，从而生成更准确、更可靠的回答。</p>

            <h3>在Langchain中实现 RAG</h3>
            <p>Langchain为实现RAG提供了丰富的组件和抽象，使得构建RAG系统变得相对容易。核心组件包括：</p>
            <ul>
                <li><strong>Document Loaders:</strong> 用于从各种来源加载文档（如PDF、网页、数据库等）。</li>
                <li><strong>Text Splitters:</strong> 用于将长文档分割成更小的、适合嵌入和检索的块。</li>
                <li><strong>Text Embedding Models:</strong> 用于将文本块转换为向量表示，以便进行相似度搜索。</li>
                <li><strong>Vector Stores:</strong> 用于存储文本块的向量嵌入，并支持高效的相似度搜索。</li>
                <li><strong>Retrievers:</strong> 用于根据用户查询从Vector Store中检索相关的文档块。</li>
                <li><strong>LLMs:</strong> 用于接收检索到的文档块和用户查询，并生成最终答案。</li>
                <li><strong>Chains:</strong> 用于将上述组件连接起来，形成一个完整的RAG工作流。</li>
            </ul>

            <p>以下是一个简化的RAG流程示例（使用伪代码和概念描述）：</p>
            <pre><code class="language-python">
# 概念性示例，非直接运行代码

# 1. 加载和处理文档
# from langchain_community.document_loaders import PyPDFLoader
# from langchain.text_splitter import RecursiveCharacterTextSplitter
# from langchain_community.embeddings import OpenAIEmbeddings # 或其他Embedding模型
# from langchain_community.vectorstores import Chroma # 或其他Vector Store

# loader = PyPDFLoader("your_document.pdf")
# documents = loader.load()

# text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
# splits = text_splitter.split_documents(documents)

# embeddings = OpenAIEmbeddings() # 使用Qwen的Embedding模型
# from langchain_community.embeddings import DashScopeEmbeddings
# embeddings = DashScopeEmbeddings(api_key=os.environ.get("DASHSCOPE_API_KEY"), model="text-embedding-v1")


# 2. 创建和填充 Vector Store
# vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)

# 3. 创建 Retriever
# retriever = vectorstore.as_retriever()

# 4. 构建 RAG Chain
# from langchain.chains import RetrievalQA
# from langchain_openai import ChatOpenAI # 或Qwen LLM

# qwen_llm_rag = ChatOpenAI(
#     base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
#     api_key=os.environ.get("DASHSCOPE_API_KEY"),
#     model="qwen-plus",
#     temperature=0.1
# )

# rag_chain = RetrievalQA.from_chain_type(
#     llm=qwen_llm_rag,
#     chain_type="stuff", # 将所有检索到的文档填充到提示词中
#     retriever=retriever
# )

# 5. 调用 RAG Chain
# user_query = "关于文档中的某个主题，请告诉我更多信息。"
# response = rag_chain.invoke({"query": user_query})
# print(response)

                    </code></pre>
            <p>在实际应用中，你需要选择合适的Document Loader、Text Splitter、Embedding Model和Vector Store，并根据具体需求配置RAG Chain。</p>

            <h3>RAG 的优势和适用场景</h3>
            <p><strong>优势：</strong></p>
            <ul>
                <li>提高生成文本的事实准确性和相关性。</li>
                <li>能够利用最新或特定领域的知识。</li>
                <li>减少LLM的“幻觉”现象。</li>
                <li>提供信息来源（如果检索系统支持）。</li>
            </ul>
            <p><strong>适用场景：</strong></p>
            <ul>
                <li>基于特定文档或知识库的问答系统。</li>
                <li>需要最新信息的文本生成任务（如新闻摘要、报告生成）。</li>
                <li>构建领域特定的AI助手。</li>
                <li>提高聊天机器人回答的准确性。</li>
            </ul>

            <h3>总结</h3>
            <p>Retrieval Augmented Generation (RAG) 是一种强大的技术，通过结合信息检索和文本生成，显著提升了LLM在处理外部知识和最新信息时的能力。Langchain提供了构建RAG系统的全面工具集，使得开发者能够轻松地创建能够访问和利用外部知识库的智能应用。在需要LLM基于特定信息源生成准确、相关和事实性强的文本时，RAG是首选的架构模式。</p>
        </section>

        <div class="navigation">
            <a href="../langchain_tutorial_outline.html">返回教程目录</a>
            <a href="../chapter10/chapter10_7_self_consistency.html">&larr; 上一节：10.7 Self-Consistency（自洽性）</a>
            <a href="../chapter10/chapter10_9_prompt_chaining.html">下一节：10.9 Prompt Chaining（提示词链） &rarr;</a>
        </div>
    </div>
</body>
</html>
